package com.nageoffer.shortlink.admin.common.biz.user;

import com.alibaba.ttl.TransmittableThreadLocal;

import java.util.Optional;

/**
 * 用户上下文类，用于存储和获取当前线程中的用户信息。
 */
public final class UserContext {

    // 使用 TransmittableThreadLocal 来保存用户信息，该类可以在线程池等场景中传递值
    private static final ThreadLocal<UserInfoDTO> USER_THREAD_LOCAL = new TransmittableThreadLocal<>();

    /**
     * 将用户信息设置到当前线程的上下文中。
     *
     * @param user 用户信息对象，包含用户的详细信息。
     */
    public static void setUser(UserInfoDTO user) {
        USER_THREAD_LOCAL.set(user);  // 将用户信息存入当前线程的上下文中
    }

    /**
     * 获取当前线程上下文中的用户 ID。
     *
     * @return 当前用户的 ID，若用户信息为空则返回 null。
     */
    public static String getUserId() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();  // 获取当前线程的用户信息
        return Optional.ofNullable(userInfoDTO)  // 如果用户信息为空则返回 null
                .map(UserInfoDTO::getUserId)  // 获取用户 ID
                .orElse(null);  // 如果没有用户信息，则返回 null
    }

    /**
     * 获取当前线程上下文中的用户名。
     *
     * @return 当前用户的用户名，若用户信息为空则返回 null。
     */
    public static String getUsername() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();  // 获取当前线程的用户信息
        return Optional.ofNullable(userInfoDTO)  // 如果用户信息为空则返回 null
                .map(UserInfoDTO::getUsername)  // 获取用户名
                .orElse(null);  // 如果没有用户信息，则返回 null
    }

    /**
     * 获取当前线程上下文中的用户真实姓名。
     *
     * @return 当前用户的真实姓名，若用户信息为空则返回 null。
     */
    public static String getRealName() {
        UserInfoDTO userInfoDTO = USER_THREAD_LOCAL.get();  // 获取当前线程的用户信息
        return Optional.ofNullable(userInfoDTO)  // 如果用户信息为空则返回 null
                .map(UserInfoDTO::getRealName)  // 获取用户真实姓名
                .orElse(null);  // 如果没有用户信息，则返回 null
    }

    /**
     * 清除当前线程的用户信息，避免泄漏。
     */
    public static void removeUser() {
        USER_THREAD_LOCAL.remove();  // 清除当前线程的用户信息
    }
}
